package errs

import (
	"github.com/labstack/echo"
	"runtime"
)

// 业务代码中反馈已知的，用户调用错误产生的错误
func Called(msg string, code ...int) *Error {
	return &Error{
		Message: msg,
		Code:    append(code, 0)[0],
		Display: true,
		NotLog:  true,
	}
}

// 业务代码中报告其他模块中返回的错误
func Report(msg string, err error) *Error {
	if _err, ok := err.(*Error); ok {
		return _err // 已处理，直接返回
	}
	_err := &Error{
		Message: msg+":"+err.Error(),
		Code:    0,
	}
	// 获取错误所在位置
	if _, file, line, ok := runtime.Caller(1); ok {
		_err.Caller.File = file
		_err.Caller.Line = line
	}
	return _err
}

// 处理最终抛出的异常
func Panic(c echo.Context, data interface{}) *Error {
	if err, ok := data.(error); ok {
		return Final(c, err)
	}
	c.Logger().Error("未定义的异常:", data)
	return &Error{}
}

// 处理最终返回的错误
func Final(c echo.Context, err error) *Error {
	res, ok := err.(*Error)
	if !ok {
		res = &Error{
			Message: err.Error(),
		}
		// 区分不同库返回的错误，并添加帮助排查错误的信息
		switch _err := err.(type) {
		case *echo.HTTPError:
			if _err.Code == 404 {
				res.Message += ";path="+c.Request().URL.Path
				res.Display = true
			}
		}
	}
	if !res.NotLog {
		c.Logger().Error(res.String())
	}
	return res
}